
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Seata - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>Seata - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">事务的ACID四大特性分别是什么，它们各自保证了什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">A (原子性): 事务中的所有操作要么全部完成，要么全部不做，没有中间状态。C (一致性): 事务的执行必须保证系统数据从一个一致状态到另一个一致状态。I (隔离性): 多个事务并发执行时，一个事务的中间状态不应被其他事务感知。D (持久性): 事务一旦完成，其对数据的变更就是永久的，即使系统宕机也不会丢失。</div>
          </div>
          <div class="card-source">来源: 事务特性(ACID)</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">概念</div>
          <div class="card-question">什么是分布式事务？其实质目标是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">概念</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">分布式事务是指一次大的操作由分布在不同服务器上、属于不同应用的小操作组成。它需要保证这些小操作要么全部成功，要么全部失败。其本质是为了保证不同数据库之间的数据一致性。</div>
          </div>
          <div class="card-source">来源: 什么是分布式事务</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">请解释分布式理论中的CAP定理。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">CAP定理指出，一个分布式系统无法同时满足以下三个特性：C (一致性 - Consistency): 所有节点在同一时间具有相同的数据视图；A (可用性 - Availability): 每个请求都能在合理时间内获得响应；P (分区容错性 - Partition tolerance): 系统在网络分区故障时仍能正常服务。通常系统只能在三者中选择两者。</div>
          </div>
          <div class="card-source">来源: 分布式理论 - CAP</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">BASE理论的核心思想是什么？它包含哪三个要素？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">BASE理论的核心思想是：即使无法做到强一致性，但每个应用都可以根据自身业务特点，采用适当的方式来使系统达到最终一致性和基本可用性。它包含三个要素：Basically Available (基本可用)、Soft state (软状态)和Eventually consistent (最终一致性)。</div>
          </div>
          <div class="card-source">来源: 分布式理论 - BASE</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">2PC（两阶段提交）协议包含哪两个阶段？请简要描述。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">2PC包含两个阶段：1. 预处理阶段：事务管理器向所有参与者发送Prepare消息，参与者执行本地事务并写入Redo/Undo日志，但暂不提交。2. 提交阶段：如果所有参与者都返回成功，事务管理器发送Commit消息；若有任何参与者失败，则发送回滚消息，参与者根据指令提交或回滚。</div>
          </div>
          <div class="card-source">来源: 分布式解决方案 - 2PC</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">2PC（两阶段提交）协议存在哪些主要缺点？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">2PC协议的主要缺点包括：1) 同步阻塞问题，资源会被锁定；2) 事务协调器的单点故障问题；3) 在提交阶段因网络问题可能导致的数据不一致；4) 在协调者和唯一收到Commit消息的参与者同时宕机时，事务状态无法确认。</div>
          </div>
          <div class="card-source">来源: 分布式解决方案 - 2PC - 4、2PC缺点</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">TCC分布式事务模式由哪三个阶段组成？它们各自的作用是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">TCC模式由三个阶段组成：1. Try阶段：进行业务检查和资源预留；2. Confirm阶段：在所有分支事务的Try阶段都成功后，执行确认提交，完成最终的业务逻辑；3. Cancel阶段：在任何分支事务的Try阶段失败后，执行业务取消，释放预留的资源。</div>
          </div>
          <div class="card-source">来源: 分布式解决方案 - TCC</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">数据库中的`undo log`和`redo log`的主要作用和区别是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`undo log`记录数据被修改前的值，主要用于事务回滚，保证事务的原子性。`redo log`记录修改后的数据，用于在数据库宕机后恢复数据，确保事务的持久性。</div>
          </div>
          <div class="card-source">来源: 数据库日志文件 - undo log & redo log</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在Seata分布式事务框架中，TC、TM和RM这三个核心角色分别是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. TC (Transaction Coordinator) - 事务协调者：维护全局和分支事务的状态，驱动全局事务的提交或回滚。2. TM (Transaction Manager) - 事务管理器：定义全局事务的范围，负责开始、提交或回滚全局事务。3. RM (Resource Manager) - 资源管理器：管理分支事务处理的资源，并与TC交互以注册和报告分支事务的状态。</div>
          </div>
          <div class="card-source">来源: Seata - 概念 - 2、Seata术语</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Seata的AT模式是如何实现自动数据回滚的？它依赖于什么关键表？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Seata的AT模式通过在每个微服务的数据库中额外创建一张`undo_log`表来实现自动回滚。在第一阶段事务提交前，AT模式会将原始数据（数据快照）记录到该表中。如果全局事务需要回滚，Seata会根据`undo_log`表中的记录来恢复数据。</div>
          </div>
          <div class="card-source">来源: Seata事务模式 - AT模式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">Seata的TCC模式与AT模式相比，在实现上对开发者有什么不同要求？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">与几乎不需要修改业务代码的AT模式不同，TCC模式要求开发者必须为每个分支事务自定义实现三个阶段的逻辑：一阶段的prepare行为（Try），二阶段的commit行为（Confirm），以及二阶段的rollback行为（Cancel）。因此，TCC模式的业务侵入性更强。</div>
          </div>
          <div class="card-source">来源: Seata事务模式 - TCC模式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Seata AT模式的完整执行流程是怎样的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. TM向TC注册全局事务，获取XID。2. XID通过服务调用链路传递。3. RM向TC注册分支事务。4. RM在执行SQL前保存数据前镜像，执行后保存后镜像到`undo_log`表，然后提交本地事务。5. TC汇总所有分支事务结果，若全部成功则通知RM清理回滚记录；若有失败则通知RM根据`undo_log`记录进行回滚。</div>
          </div>
          <div class="card-source">来源: Seata AT模式执行原理</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
